/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package generatorGraphics.interfaces;

import dataProcessor.compileJJ.CompileJJ;
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import javax.swing.*;
import org.jdesktop.swingx.JXCollapsiblePane;

/**
 *
 * @author Heitor
 */
public class JFScreen extends JFrame{
    
    /**
     * Componentes Graficos
     */    
    private JPanel jpNorth;
    private JScrollPane jspCenter;
   
    /**
     * Componentes do painel norte
     */
    private JToolBar jToolBar;
    public JXCollapsiblePane jCollapsible;
    
    /** Armazena o painel de gráficos */
    private JPGraphics jpGraphics;
    
    /**
     * Paineis que podem ser alocados dentro do jCollapsible
     */
    private JPCategory jpCategory;
    
    /** Armazena os botões da barra de ferramentas */
    private ArrayList<JButton> buttonsToolBar;
    
    /** 
     * Método extra para geração de icones (Em analise)
     */
    private static final GridBagConstraints gbc;  
    static {  
        gbc = new GridBagConstraints();  
        gbc.gridx = 0;  
        gbc.gridy = 0;  
        gbc.weightx = 1.0;  
        gbc.weighty = 1.0;  
        gbc.fill = GridBagConstraints.BOTH;  
        gbc.anchor = GridBagConstraints.NORTHWEST;  
    }
    
    /**
     * Construtor
     */
    public JFScreen(){

        initComponents();
        
        treatEvents();
        
        setTitle(getTitle() + "Generator Graphics");
        /* setLocationRelativeTo
        * Define localização da janela na tela:
        * NULL - centro da tela.
        */
        setLocationRelativeTo(null);
        /* setDefaultCloseOperation
        * Define ação quando a janela for fechada:
        * EXIT_ON_CLOSE - finaliza o aplicativo
        * DISPOSE_ON_CLOSE - devolve os recursos ao sistema
        * HIDE_ON_CLOSE - oculta a janela
        * DO_NOTHING_ON_CLOSE - usuário indica se a janela será fechada. */
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setMinimumSize(new Dimension(750, 450));
        
        setMinimumSize(new Dimension(750, 550));
        
        setIconImage((new ImageIcon(JFScreen.class.getResource("/generatorGraphics/images/graph_128x128.png"))).getImage());
        
        //Toolkit kit = Toolkit.getDefaultToolkit();
        //Dimension tamTela = kit.getScreenSize();
        //setMaximumSize(tamTela);        
    }

    /**
     * Inicia os componentes gráficos do frame
     */
    private void initComponents(){
    
        /*
         * O frame será dividido em dois paineis principais.
         * O jpNorth, que irá armazena a barra de ferramentas e jXCollapsiblePane,
         * e jpCenter, este armazena o painel que mostrará o gráfico.
         */ 
        
        /*
         * JPNorth:
         */
        jpNorth = new JPanel();
            jpNorth.setLayout(new BorderLayout());

            jToolBar = new JToolBar();
            
            buttonsToolBar = new ArrayList<>();
            
            /*
             * Características da barra de ferramentas:
             * - Constrói todos os botões e seus eventos
             * - Constrói todos os paineis que poderão ficar no jCollapsible
             */
            featuresTool();
            
            /*
             * Adiciona todos os botões da barra de ferramentas (buttonsToolBar)
             */
            for(int j=0; j<buttonsToolBar.size(); j++){
                jToolBar.add(buttonsToolBar.get(j));
            }

            /*
            * Instanciando o jCollapsible
            */
            jCollapsible = new JXCollapsiblePane();
            jCollapsible.setAnimated(false);
            jCollapsible.setCollapsed(true);
            
            // Adicionando componentes no painel norte
            jpNorth.add(BorderLayout.NORTH, jToolBar);
            jpNorth.add(BorderLayout.CENTER, jCollapsible);
            jpNorth.add(BorderLayout.AFTER_LAST_LINE, new JPopupMenu.Separator(){
                    @Override
                    protected void paintComponent(Graphics g) {
                        g.setColor(Color.LIGHT_GRAY);
                        g.drawLine(0, 0, getContentPane().getWidth(), 0);
                    }
                });
        
        /*
        * JSPCenter:
        */
        jspCenter = new JScrollPane();
        
            /*
             * Instancia a classe JPGraphics:
             * - Adiciona os tipos e unidades do grafico
             * - Caso precise adiciona um botão extra (FUNCIONALIDADE AINDA NÃO IMPLEMENTADA)
             */
            jpGraphics = new JPGraphics(this, null);
                
            jspCenter.setViewportView(jpGraphics);
            jspCenter.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            jspCenter.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        
        setLayout(new BorderLayout());
        add(BorderLayout.NORTH, jpNorth);
        add(BorderLayout.CENTER, jspCenter);
        
        repaint();
        pack();

    }


    /**
     * Configura todas as caracteristicas da barra de ferramentas:
     * - Constrói botões e seus eventos
     * - Constrói paineis
     */
    private void featuresTool(){

        buttonsToolBar = new ArrayList<>();
        
        /*
         * Constrói todos os botões da barra de ferramentas
         */
        JButton jbCategory = new JButton("Category");
        jbCategory.setIcon(new ImageIcon(JFScreen.class.getResource("/generatorGraphics/images/categoryIcon2.jpg")));
        jbCategory.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                jbCategoryActionPerformed();
            }
        });
        //jbCategory.setMaximumSize(new Dimension(80, 70));
        
        buttonsToolBar.add(jbCategory);
        
        //Botão apenas para O programador - Compilação de arquivos JJ
            JButton jbCompileJJ = new JButton("CompileJJ (Optional)");
            jbCompileJJ.setIcon(null);
            jbCompileJJ.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    CompileJJ compile = new CompileJJ();
                    compile.setVisible(true);
                    compile.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                }
            });

            buttonsToolBar.add(jbCompileJJ);
        
        /*
         * Constrói todos os paineis
         */
        jpCategory = new JPCategory();
        
        jpCategory.setVisible(true);
        
    }
    
    
    /**
     * Método que trata os eventos do frame
     */
    private void treatEvents(){
        
        /*
         * Eventos da janela
         */
        addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {
                screenResize();
            }
        });
        
        addWindowStateListener(new WindowStateListener() {

            @Override
            public void windowStateChanged(WindowEvent e) {
                screenResize();
            }
        });
       
    }
    
    /**
     * Método que trata a ação do botão de Categoria
     */
    private void jbCategoryActionPerformed(){
        
        /*
         * Setando painel de Categoria.
         * Painel sendo alocado no jCollapsible caso o botão tenha sido pressionado.
         */
        jCollapsible.add(jpCategory);
        
        if (jCollapsible.isCollapsed()){
            jCollapsible.setCollapsed(false);
        } else{
            jCollapsible.setCollapsed(true);
        }
        
        screenResize();
    }

    /**
     * @return the jpCategory
     */
    public JPCategory getJpCategory() {
        return jpCategory;
    }

    /**
     * @param jpCategory the jpCategory to set
     */
    public void setJpCategory(JPCategory jpCategory) {
        this.jpCategory = jpCategory;
        this.jpCategory.setVisible(true);
        
        updateJpCategory();
    }
    
    /**
     * Verifica e atualizar o jpGraphics no momento em que algum botão do jpCategory é clicado
     */
    private void checkJPGraphics(){
        
        if(jpGraphics.getCurrentCategory() != jpCategory.getCatActive()){
            jpGraphics.removeAll();
            jpGraphics = null;
            jpGraphics = new JPGraphics(this, jpCategory.getCatActive());
        }
        
        screenResize();
    }
    
    /**
     * Método que trata quando a tela é redimensionada
     */
    public void screenResize(){

        //Dimension curSize = getSize();
        //jpGraphics.componentGraphResize(curSize);
        jpGraphics.componentGraphResize(jspCenter.getSize());
        jpGraphics.setVisible(true);

        jspCenter.setViewportView(jpGraphics);
        jspCenter.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
        jspCenter.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
        jspCenter.setVisible(true);
                
    }
    
    /**
     * Atualiza o painel de categoria
     */
    private void updateJpCategory(){
        
        for(int u=0; u<jpCategory.getComponents().length; u++){
            try{
                getJpCategory().getComponent(u).addMouseListener(new MouseAdapter() {

                    @Override
                    public void mouseClicked(MouseEvent e) {
                        checkJPGraphics();
                    }
                });
                
            } catch (Exception e){
                System.out.println("[Erro-JFScreen] (Talvez o jpCategory tenha algo que não seja JButton) " + e.toString());
            }
        }
        
        jpCategory.setVisible(true);
        
    }
    
}
